home *** CD-ROM | disk | FTP | other *** search
- #!/usr/local/bin/perl -- -*- C -*-
-
- # Perl Routines to Manipulate CGI input
-
- # Sample
- # require "cgi-lib.pl";
- # if (&ReadParse(*input)) {
- # print &PrintHeader, &PrintVariables(%input);
- # } else {
- # print &PrintHeader,'<form><input type="submit">Data: <input name="myfield">';
- #}
-
- # ReadParse
- # Reads in GET or POST data, converts it to unescaped text, and puts
- # one key=value in each member of the list "@in"
- # Also creates key/value pairs in %in, using '\0' to separate multiple
- # selections
-
- # Returns TRUE if there was input, FALSE if there was no input
- # UNDEF may be used in the future to indicate some failure.
-
- # Now that cgi scripts can be put in the normal file space, it is useful
- # to combine both the form and the script in one place. If no parameters
- # are given (i.e., ReadParse returns FALSE), then a form could be output.
-
- # If a variable-glob parameter (e.g., *cgi_input) is passed to ReadParse,
- # information is stored there, rather than in $in, @in, and %in.
-
- sub ReadParse {
- local (*in) = @_ if @_;
- local ($i, $key, $val);
-
- # Read in text
- if (&MethGet) {
- $in = $ENV{'QUERY_STRING'};
- } elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
- read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
- }
-
- @in = split(/&/,$in);
-
- foreach $i (0 .. $#in) {
- # Convert plus's to spaces
- $in[$i] =~ s/\+/ /g;
-
- # Split into key and value.
- ($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
-
- # Convert %XX from hex numbers to alphanumeric
- $key =~ s/%(..)/pack("c",hex($1))/ge;
- $val =~ s/%(..)/pack("c",hex($1))/ge;
-
- # Associate key and value
- $in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
- $in{$key} .= $val;
-
- }
-
- return length($in);
- }
-
-
- # PrintHeader
- # Returns the magic line which tells WWW that we're an HTML document
-
- sub PrintHeader {
- return "Content-type: text/html\n\n";
- }
-
-
- # MethGet
- # Return true if this cgi call was using the GET request, false otherwise
-
- sub MethGet {
- return ($ENV{'REQUEST_METHOD'} eq "GET");
- }
-
- # MyURL
- # Returns a URL to the script
- sub MyURL {
- return 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'};
- }
-
- # CgiError
- # Prints out an error message which which containes appropriate headers,
- # markup, etcetera.
- # Parameters:
- # If no parameters, gives a generic error message
- # Otherwise, the first parameter will be the title and the rest will
- # be given as different paragraphs of the body
-
- sub CgiError {
- local (@msg) = @_;
- local ($i,$name);
-
- if (!@msg) {
- $name = &MyURL;
- @msg = ("Error: script $name encountered fatal error");
- };
-
- print &PrintHeader;
- print "<html><head><title>$msg[0]</title></head>\n";
- print "<body><h1>$msg[0]</h1>\n";
- foreach $i (1 .. $#msg) {
- print "<p>$msg[$i]</p>\n";
- }
- print "</body></html>\n";
- }
-
- # PrintVariables
- # Nicely formats variables in an associative array passed as a parameter
- # And returns the HTML string.
-
- sub PrintVariables {
- local (%in) = @_;
- local ($old, $out, $output);
- $old = $*; $* =1;
- $output .= "<DL COMPACT>";
- foreach $key (sort keys(%in)) {
- foreach (split("\0", $in{$key})) {
- ($out = $_) =~ s/\n/<BR>/g;
- $output .= "<DT><B>$key</B><DD><I>$out</I><BR>";
- }
- }
- $output .= "</DL>";
- $* = $old;
-
- return $output;
- }
-
- # PrintVariablesShort
- # Nicely formats variables in an associative array passed as a parameter
- # Using one line per pair (unless value is multiline)
- # And returns the HTML string.
-
-
- sub PrintVariablesShort {
- local (%in) = @_;
- local ($old, $out, $output);
- $old = $*; $* =1;
- foreach $key (sort keys(%in)) {
- foreach (split("\0", $in{$key})) {
- ($out = $_) =~ s/\n/<BR>/g;
- $output .= "<B>$key</B> is <I>$out</I><BR>";
- }
- }
- $* = $old;
-
- return $output;
- }
-
- 1; #return true
-
-